<?php

namespace Org\Util;

/**
 * 日期时间工具类
 * @package Org\Util
 * @author  PengWeifeng <gitphp@qq.com>
 */
class DateTime
{
    /**
     * 生成指定时间范围内的随机时间戳
     *
     * @param string $begintime 开始时间
     * @param string $endtime   结束时间，为空时取当前时间
     *
     * @return int
     */
    public static function getRandTime($begintime, $endtime = '')
    {
        $begin = strtotime($begintime);
        $end = $endtime == '' ? mktime() : strtotime($endtime);
        $timestamp = rand($begin, $end);
        return $timestamp;
    }

    /**
     * 通过类型/秒数生成随机时间戳
     *
     * @param string|int $range day-一天内随机 week-一周内随机 month-一月内随机 整数-秒数
     *
     * @return int
     * @throws \Exception 当输入不存在的类型参数或者参数类型错误时
     */
    public static function getRandTimeByType($range)
    {
        $time = time();
        if (is_int($range)) {
            $begintime = $time - $range;
        } elseif (is_string($range)) {
            $case = array(
                'day'   => $time - 24 * 3600,
                'week'  => $time - 7 * 24 * 3600,
                'month' => $time - 30 * 24 * 3600
            );
            if (!in_array($range, array_keys($case))) {
                E('不存在的类型');
            }
            $begintime = $case[$range];
        } else {
            E('参数类型错误');
        }
        return rand($begintime, $time);
    }

    /**
     * 判断字符串是否有效日期时间格式
     *
     * @param string $date
     * @param array  $formats 要求日期时间格式列表 不为空时进行验证
     *
     * @return bool|int 验证失败返回False,否则返回其时间戳
     */
    public static function isValidate($date, array $formats = array())
    {
        $unixTime = strtotime($date);
        if ($unixTime === false) {
            return false;
        }
        if (!empty($formats)) {
            //校验日期的有效性，只要满足其中一个格式就OK
            foreach ($formats as $format) {
                if (date($format, $unixTime) == $date) {
                    return $unixTime;
                }
            }
            return false;
        } else {
            return $unixTime;
        }
    }

    /**
     * 获取上周的开始结束时间戳
     * @return array [begin,end]
     */
    public static function lastWeek()
    {
        $begin = mktime(0, 0, 0, date('m'), date('d') - (date('w') + 6), date('Y'));
        $end = mktime(23, 59, 59, date('m'), date('d') - date('w'), date('Y'));
        return array($begin, $end);
    }

    /**
     * 获取上月的开始结束时间戳
     * @return array [begin,end]
     */
    public static function lastMonth()
    {
        $begin = mktime(0, 0, 0, date('n') - 1, 1, date('Y'));
        $end = mktime(23, 59, 59, date('n'), 0, date('Y'));
        return array($begin, $end);
    }

    /**
     * 获取前一天开始结束时间戳
     * @return array
     */
    public static function lastDay()
    {
        $begin = mktime(0, 0, 0, date('n'), date('d') - 1, date('Y'));
        $end = mktime(23, 59, 59, date('n'), date('d') - 1, date('Y'));
        return array($begin, $end);
    }
}